package me.firstapp.spi.shop;

import java.util.Map;

import me.firstapp.common.json.ListObject;
import me.firstapp.common.json.PageObject;
import me.firstapp.common.json.SingleObject;
import me.firstapp.common.module.shop.JsonDistributeCall;
import me.firstapp.common.module.shop.JsonOrder;
import me.firstapp.common.module.shop.JsonOrderInManage;
import me.firstapp.common.module.shop.JsonOrderItemInManage;
import me.firstapp.common.module.shop.JsonPayRecord;

public interface OrderService {

	/**
	 * 调用创建订单接口
	 * 
	 * @param memberId
	 * @param remark
	 * @return
	 */
	SingleObject<JsonOrder> createOrder(Long memberId, String remark);

	/**
	 * 调用通过订单号查询订单接口
	 * 
	 * @param orderNo
	 * @param itemsFlag
	 * @return
	 */
	SingleObject<JsonOrder> findOrderByOrderNo(String orderNo, boolean itemsFlag);

	/**
	 * 调用支付订单接口
	 * 
	 * @param memberId
	 * @param orderNo
	 * @param password
	 * @return
	 */
	SingleObject<JsonOrder> payOrder(Long memberId, String orderNo, String password);

	/**
	 * 调用取消订单接口
	 * 
	 * @param orderNo
	 * @return
	 */
	SingleObject<JsonOrder> cancelOrder(String orderNo);

	/**
	 * 调用取消订单接口
	 * 
	 * @param orderNo
	 * @param apiClientId
	 * @return
	 */
	SingleObject<JsonOrder> cancelOrder(String orderNo, Long apiClientId);

	/**
	 * 调用完成订单接口
	 * 
	 * @param orderNo
	 * @return
	 */
	SingleObject<JsonOrder> completeOrder(String orderNo);

	/**
	 * 调用订单发货接口
	 * 
	 * @param orderNo
	 * @param expressName
	 * @param expressNo
	 * @return
	 */
	SingleObject<JsonOrder> distributeOrder(String orderNo, String expressName, String expressNo);

	/**
	 * 调用分页查询订单接口
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @param memberId
	 * @param status
	 * @return
	 */
	PageObject<JsonOrder> findOrderPage(Integer pageNo, Integer pageSize, Long memberId, Integer status);

	/**
	 * 调用分页查询订单接口
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @param searchParams
	 * @param sortParam
	 * @param sortType
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	PageObject<JsonOrderInManage> findOrderPage(Integer pageNo, Integer pageSize, Map<String, Object> searchParams,
			String sortParam, String sortType, Long startTime, Long endTime);

	/**
	 * 调用分页查询支付记录接口
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @param searchParams
	 * @param sortParam
	 * @param sortType
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	PageObject<JsonPayRecord> findPayRecordPage(Integer pageNo, Integer pageSize, Map<String, Object> searchParams,
			String sortParam, String sortType, Long startTime, Long endTime);

	/**
	 * 调用分页查询item接口
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @param searchParams
	 * @param sortParam
	 * @param sortType
	 * @param orderId
	 * @return
	 */
	PageObject<JsonOrderItemInManage> findOrderItemPage(Integer pageNo, Integer pageSize,
			Map<String, Object> searchParams, String sortParam, String sortType, Long orderId);

	/**
	 * 调用查询订单列表接口
	 * 
	 * @param memberId
	 * @param status
	 * @return
	 */
	ListObject<JsonOrder> findOrders(Long memberId, Integer status);

	/**
	 * 调用查询订单列表接口
	 * 
	 * @param memberId
	 * @param status
	 * @param apiClientId
	 * @return
	 */
	ListObject<JsonOrder> findOrders(Long memberId, Integer status, Long apiClientId);

	/**
	 * 分页查询订单发货提醒接口
	 * 
	 * @param pageNo
	 * @param pageSize
	 * @param searchParams
	 * @param sortParam
	 * @param sortType
	 * @return
	 */
	PageObject<JsonDistributeCall> findDistributeCallPage(Integer pageNo, Integer pageSize,
			Map<String, Object> searchParams, String sortParam, String sortType);

	/**
	 * 新增或更新订单提醒
	 * 
	 * @param memberId
	 * @param orderNo
	 * @return
	 */
	SingleObject<Object> addUpdateDistributeCall(Long memberId, String orderNo);

	/**
	 * 处理订单提醒
	 * 
	 * @param orderNo
	 * @return
	 */
	SingleObject<Object> handleDistributeCall(String orderNo);
}
